void main() {
  /**
   * 声明变量使用 var 关键字,如果声明变量时候没有初始化，则它的默认值为null。
   * 不可变变量声明的时候加 final。
   * 常量声明使用 const,const 常量的值可以是由四则运算得出来的。
   */
  var defaultvar; //如果对象没有初始化，那么他的默认值为 null.
  var name = "zhangsan";
  final username2 = "lisi";
  const PI = 3.14;
  const N = 3;
  /**
   * 可以通过const来创建常量的值，就是说const[]本身也是构造函数，如:
   */
  final stars = const[PI, N];
  var sts = const[PI, N];
  const bottons = const[];

  print(name);
  print(username2);
}

///基本数据类型
class BasicDataType {
  /**
   * Dart语言常用的基本数据类型包括：Number,String,Boolean,List,Map。
   */

  /**
   * Number 类型，包括（int）整型和(double)浮点型  int,double 是Number的子类型。 可以正常进行各种运算
   */

  ///声明带类型的变量的时候就不用“var”关键字了
  int count = 5;
  final int C = 6;

  /**
   * String类型，字符串类型。 直接声明的时候可以用 单引号 或者 双引号
   */

  ///单引号来声明字符串
  String str = 'xx';

  ///双引号来声明字符串
  String str1 = 'xx2';

  ///使用 三个单引号或者双引号来声明多行字符串（大文本快）
  String str2 = """
  多行数据
  多行数据
  """;

  String str3 = '''
  多行数据，
  模拟诗句
  ''';

  /**
   * Boolean 类型
   * Dart是强bool类型检查，只有bool类型的值是 true 才能被认为true。 0 或者大于0 不等于空都不行，
   */

  ///Dart是强bool类型检查，只有bool类型的值是 true 才能被认为true。 0 或者大于0 不等于空都不行，
  booleanTest() {
    bool sex = true;
    var var1 = 'not null';
    if (sex) {
      print("哈哈哈哈");
    }
    //if(var1){print("办呢");} 不是bool类型会报错
  }

  /**
   * List类型 Dart的List对象类似于JavaScript中的Array对象
   */

  ///使用
  listTest() {
    var list = [1, 2, 1, 4]; //也可以使用List对象的构造函数以及各种方法来构建可变以及不可变的list
    print(list.length);
    print(list[list.length - 1]);
  }

  /**
   * Map 类型
   * Map 就是键值对，key必须是唯一的。
   */

  ///Map演示
  mapTest() {
    var week = {
      'Monkey': '星期一',
      'Tuesday': '星期二',
      'Wednesday': '星期三',
      'Thursday': '星期四',
      'Friday': '星期五',
    };

    var week1 = Map();
    week1["Saturday"] = "星期六";
    week1["Sunday"] = "星期日";
    week1['0'] = "sss"; //这里的0 也是key

    //检查key是否再Map对象中：
    assert(week['Monkey'] == null);
  }
}
